package main.java;

import main.java.service.PersonServiceImpl;
import main.java.thrift.generated.PersonService;
import org.apache.thrift.TProcessorFactory;
import org.apache.thrift.protocol.TCompactProtocol;
import org.apache.thrift.server.THsHaServer;
import org.apache.thrift.server.TServer;
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TNonblockingServerSocket;

/**
 * ${DESCRIPTION}
 *
 * @author cx
 * @create 2018-03-22 14:34
 **/
public class ThriftServer {
    public static void main(String[] args) throws Exception{
        //监听端口号-非阻塞socket
        TNonblockingServerSocket socket = new TNonblockingServerSocket(8899);
        //工作线程数
        THsHaServer.Args arg = new THsHaServer.Args(socket).minWorkerThreads(2).maxWorkerThreads(4);
        //范型就是实现的接收类
        PersonService.Processor<PersonServiceImpl> processor = new PersonService.Processor<>(new PersonServiceImpl());

        /**
         * Thrift传输格式（协议)
         *
         * TBinaryProtocal-二进制格式
         * TCompactProtocol-压缩格式
         * TJSONProtocol-JSON格式
         * TSimpleJSONProtocol-提供JSON只写协议，生成的文件很容易通过脚本语言解析
         * TDebugProtocol-使用易懂的可读文本格式，以便于debug
         */
        arg.protocolFactory(new TCompactProtocol.Factory());
        /**
         * Thrift数据传输方式
         *
         * TSocket-阻塞式socket
         * TFramedTransport-以frame为单位进行传输，非阻塞式服务中使用
         * TFileTransport-以文件形式进行传输
         * TMemoryInputTransport-将内存用语I/O，Java实现时内部实际使用了简单的ByteArrayOutputStream。
         * TZlibTransport-使用zlib进行压缩，与其他传输方式联合使用。当前无java实现。
         */
        arg.transportFactory(new TFramedTransport.Factory());
        arg.processorFactory(new TProcessorFactory(processor));


        /** Thrift支持的服务模型
         *
         * TThreadPoolServer - 简单的单线程服务模型，常用于测试
         * TSimpleServer - 多线程服务模型，使用标准的阻塞式IO
         * TNonblockingServer - 多线程服务模型，使用非阻塞式IO（需要使用TFramedTransport数据传输方式）
         * THsHaServer-THsHa引入了线程池去处理，其模型把读写任务放到线程池处理;Half-sync/Half-async的处理模式，Half-async是在处理IO事件上
         （accept/read/write io),Half-sync用于handler对rpc的同步处理。
         */
        //半同步半异步的server
        TServer server = new THsHaServer(arg);

        System.out.println("Thrift Server started!");

        //死循环，永远不会退出
        server.serve();
    }
}
